test_that("the `fmt_integer()` function works correctly in the LaTeX context", {

  # Create an input data frame four columns: two
  # character-based and two that are numeric
  data_tbl <-
    data.frame(
      char_1 = c("saturday", "sunday", "monday", "tuesday",
                 "wednesday", "thursday", "friday"),
      char_2 = c("june", "july", "august", "september",
                 "october", "november", "december"),
      num_1 = c(1836.23, 2763.39, 937.29, 643.00, 212.232, 0, -23.24),
      num_2 = c(34, 74, 23, 93, 35, 76, 57),
      stringsAsFactors = FALSE
    )

  # Create a `gt_tbl` object with `gt()` and the `data_tbl` dataset
  tab <- gt(data_tbl)

  # Expect that the object has the correct classes
  expect_is(tab, c("gt_tbl", "data.frame"))

  # Extract vectors from the table object for comparison
  # to the original dataset
  char_1 <- (tab %>% dt_data_get())[["char_1"]]
  char_2 <- (tab %>% dt_data_get())[["char_2"]]
  num_1 <- (tab %>% dt_data_get())[["num_1"]]
  num_2 <- (tab %>% dt_data_get())[["num_2"]]

  # Expect the extracted values to match those of the
  # original dataset
  expect_equal(data_tbl$char_1, char_1)
  expect_equal(data_tbl$char_2, char_2)
  expect_equal(data_tbl$num_1, num_1)
  expect_equal(data_tbl$num_2, num_2)

  # Expect an error when attempting to format a column
  # that does not exist
  expect_error(
    tab %>%
      fmt_integer(columns = num_3)
  )

  # Expect an error when using a locale that does not exist
  expect_error(
    tab %>%
      fmt_integer(columns = num_2, locale = "aa_bb")
  )

  # Format the `num_1` column, use all
  # other defaults
  expect_equal(
    (tab %>%
       fmt_integer(columns = num_1) %>%
       render_formats_test(context = "latex"))[["num_1"]],
    c("$1,836$", "$2,763$", "$937$", "$643$", "$212$", "$0$", "$-23$")
  )

  # Format the `num_1` column, don't use digit
  # grouping separators, use all other defaults
  expect_equal(
    (tab %>%
       fmt_integer(columns = num_1, use_seps = FALSE) %>%
       render_formats_test("latex"))[["num_1"]],
    c("$1836$", "$2763$", "$937$", "$643$", "$212$", "$0$", "$-23$")
  )

  # Format the `num_1` column, use a single space
  # character as digit grouping separators, use all other defaults
  expect_equal(
    (tab %>%
       fmt_integer(columns = num_1, sep_mark = " ") %>%
       render_formats_test("latex"))[["num_1"]],
    c("$1 836$", "$2 763$", "$937$", "$643$", "$212$", "$0$", "$-23$")
  )

  # Format the `num_1` column, use a period for the
  # digit grouping separators
  expect_equal(
    (tab %>%
       fmt_integer(columns = num_1, sep_mark = ".") %>%
       render_formats_test("latex"))[["num_1"]],
    c("$1.836$", "$2.763$", "$937$", "$643$", "$212$", "$0$", "$-23$")
  )

  # Format the `num_1` column, scale all values by
  # 1/1000, use all other defaults
  expect_equal(
    (tab %>%
       fmt_integer(columns = num_1, scale_by = 1/1000) %>%
       render_formats_test("latex"))[["num_1"]],
    c("$2$", "$3$", "$1$", "$1$", "$0$", "$0$", "$0$")
  )

  # Format the `num_1` column, prepend and append
  # all values by 2 different literals, use all other defaults
  expect_equal(
    (tab %>%
       fmt_integer(columns = num_1, pattern = "a {x} b") %>%
       render_formats_test("latex"))[["num_1"]],
    c("a $1,836$ b", "a $2,763$ b", "a $937$ b", "a $643$ b", "a $212$ b",
      "a $0$ b", "a $-23$ b")
  )

  # Format the `num_1` column, scale all values
  # by 1/1000 and append a `K` character to the resultant values, use
  # all other defaults
  expect_equal(
    (tab %>%
       fmt_integer(columns = num_1, scale_by = 1/1000, pattern = "{x}K") %>%
       render_formats_test("latex"))[["num_1"]],
    c("$2$K", "$3$K", "$1$K", "$1$K", "$0$K", "$0$K", "$0$K")
  )

  # Format the `num_1` column, use accounting style
  expect_equal(
    (tab %>%
       fmt_integer(columns = num_1, accounting = TRUE) %>%
       render_formats_test("latex"))[["num_1"]],
    c("$1,836$", "$2,763$", "$937$", "$643$", "$212$", "$0$", "$(23)$")
  )

  # Format the `num_1` column, use accounting style
  # and a pattern around the values
  expect_equal(
    (tab %>%
       fmt_integer(
         columns = num_1, accounting = TRUE, pattern = "a{x}b") %>%
       render_formats_test("latex"))[["num_1"]],
    c("a$1,836$b", "a$2,763$b", "a$937$b", "a$643$b", "a$212$b",
      "a$0$b", "a$(23)$b")
  )

  # Format the `num_1` column to 2 decimal places, force the sign
  expect_equal(
    (tab %>%
       fmt_integer(
         columns = num_1, force_sign = TRUE) %>%
       render_formats_test("latex"))[["num_1"]],
    c("$+1,836$", "$+2,763$", "$+937$", "$+643$", "$+212$", "$0$", "$-23$")
  )

  # Expect that using `force_sign = TRUE` with `accounting = TRUE`
  # will render values in accounting format
  expect_equal(
    (tab %>%
       fmt_integer(
         columns = num_1, accounting = TRUE, force_sign = TRUE) %>%
       render_formats_test("latex"))[["num_1"]],
    (tab %>%
       fmt_integer(
         columns = num_1, accounting = TRUE) %>%
       render_formats_test("latex"))[["num_1"]]
  )

  # Format the `num_1` column to 2 decimal places, force the sign and
  # define a pattern for decorating values
  expect_equal(
    (tab %>%
       fmt_integer(
         columns = num_1, pattern = "*{x}*", force_sign = TRUE) %>%
       render_formats_test("latex"))[["num_1"]],
    c(
      "*$+1,836$*", "*$+2,763$*", "*$+937$*", "*$+643$*", "*$+212$*",
      "*$0$*", "*$-23$*"
    )
  )

  # Format the `num_1`, apply the `en_US`
  # locale and use all other defaults
  expect_equal(
    (tab %>%
       fmt_integer(columns = num_1, locale = "en_US") %>%
       render_formats_test("latex"))[["num_1"]],
    c("$1,836$", "$2,763$", "$937$", "$643$", "$212$", "$0$", "$-23$")
  )

  # Format the `num_1` column, apply the `da_DK`
  # locale and use all other defaults
  expect_equal(
    (tab %>%
       fmt_integer(columns = num_1, locale = "da_DK") %>%
       render_formats_test("latex"))[["num_1"]],
    c("$1.836$", "$2.763$", "$937$", "$643$", "$212$", "$0$", "$-23$")
  )
})

test_that("the `fmt_integer()` function can scale/suffix larger numbers", {

  # Create an input data frame four columns: two
  # character-based and two that are numeric
  data_tbl <-
    data.frame(
      num = c(
        -1.8E15, -1.7E13, -1.6E10, -1.5E8, -1.4E6, -1.3E4, -1.2E3, -1.1E1,
        0,
        1.1E1, 1.2E3, 1.3E4, 1.4E6, 1.5E8, 1.6E10, 1.7E13, 1.8E15
      ),
      stringsAsFactors = FALSE
    )

  # Create a `gt_tbl` object with `gt()` and the `data_tbl` dataset
  tab <- gt(data_tbl)

  # Format the `num` column, have the `suffixing` option
  # set to TRUE (default labels, all 4 ranges used)
  expect_equal(
    (tab %>%
       fmt_integer(columns = num, suffixing = TRUE) %>%
       render_formats_test(context = "latex"))[["num"]],
    c(
      "$-1,800T$", "$-17T$", "$-16B$", "$-150M$", "$-1M$", "$-13K$",
      "$-1K$", "$-11$", "$0$", "$11$", "$1K$", "$13K$", "$1M$", "$150M$",
      "$16B$", "$17T$", "$1,800T$"
    )
  )

  # Format the `num` column, have the `suffixing`
  # option set to use custom symbols across the 4 different ranges
  expect_equal(
    (tab %>%
       fmt_integer(
         columns = num,
         suffixing = c("k", "Mn", "Bn", "Tr")) %>%
       render_formats_test(context = "latex"))[["num"]],
    c(
      "$-1,800Tr$", "$-17Tr$", "$-16Bn$", "$-150Mn$", "$-1Mn$", "$-13k$",
      "$-1k$", "$-11$", "$0$", "$11$", "$1k$", "$13k$", "$1Mn$", "$150Mn$",
      "$16Bn$", "$17Tr$", "$1,800Tr$"
    )
  )

  # Format the `num` column, have the `suffixing` option
  # set to use custom symbols for the middle two ranges (millions and billions)
  expect_equal(
    (tab %>%
       fmt_integer(
         columns = num,
         suffixing = c(NA, "Mio.", "Mia.", NA)) %>%
       render_formats_test(context = "latex"))[["num"]],
    c(
      "$-1,800,000Mia.$", "$-17,000Mia.$", "$-16Mia.$", "$-150Mio.$",
      "$-1Mio.$", "$-13,000$", "$-1,200$", "$-11$", "$0$", "$11$",
      "$1,200$", "$13,000$", "$1Mio.$", "$150Mio.$", "$16Mia.$", "$17,000Mia.$",
      "$1,800,000Mia.$"
    )
  )
})
